/**
 * 阻抗数据管理服务
 * 用于处理阻抗数据的存储和处理
 */

// 定义阻抗数据数组的最大长度
const MAX_IMPEDANCE_DATA_LENGTH = 1000

// 阻抗数据存储
let impedanceLeft = [] // 左脑阻抗数据
let impedanceRight = [] // 右脑阻抗数据
let impedanceAll = [] // 全脑平均阻抗数据
let dataIndexCounter = 0 // 数据索引计数器，用于跟踪实际数据索引

/**
 * 添加新的阻抗数据
 * @param {Number} leftValue - 左脑阻抗值
 * @param {Number} rightValue - 右脑阻抗值
 */
function addImpedanceData(leftValue, rightValue) {
  console.log('添加新的阻抗数据', leftValue, rightValue);
  
  // 计算当前全脑平均值
  const currentAverage = parseInt((leftValue + rightValue) / 2)
  
  // 管理左脑阻抗数据数组
  if (impedanceLeft.length >= MAX_IMPEDANCE_DATA_LENGTH) {
    // 删除前500条数据
    impedanceLeft.splice(0, 500)
    console.log('左脑数据达到上限，已删除前500条数据')
  }
  // 添加新的左脑阻抗数据
  impedanceLeft.push(leftValue)
  console.log('左脑数据已更新，当前长度:', impedanceLeft.length);
  
  // 管理右脑阻抗数据数组
  if (impedanceRight.length >= MAX_IMPEDANCE_DATA_LENGTH) {
    // 删除前500条数据
    impedanceRight.splice(0, 500)
    console.log('右脑数据达到上限，已删除前500条数据')
  }
  // 添加新的右脑阻抗数据
  impedanceRight.push(rightValue)
  console.log('右脑数据已更新，当前长度:', impedanceRight.length);
  
  // 管理全脑平均阻抗数据数组
  if (impedanceAll.length >= MAX_IMPEDANCE_DATA_LENGTH) {
    // 删除前500条数据
    impedanceAll.splice(0, 500)
    console.log('全脑数据达到上限，已删除前500条数据')
  }
  // 添加新的全脑平均阻抗数据
  impedanceAll.push(currentAverage)
  
  // 更新数据索引计数器
  dataIndexCounter++
  
  return true;
}

/**
 * 更新左脑阻抗数据
 * @param {Number} leftValue - 左脑阻抗值
 */
function updateLeftBrainData(leftValue) {
  // 管理左脑阻抗数据数组
  if (impedanceLeft.length >= MAX_IMPEDANCE_DATA_LENGTH) {
    // 删除前500条数据
    impedanceLeft.splice(0, 500)
    console.log('左脑数据达到上限，已删除前500条数据')
  }

  
  // 添加新的左脑阻抗数据
  impedanceLeft.push(leftValue)
  console.log('左脑数据:', impedanceLeft)
  
  // 增加数据索引计数器
  dataIndexCounter++
  
  console.log('左脑阻抗数组长度:', impedanceLeft.length, '/', MAX_IMPEDANCE_DATA_LENGTH, '数据索引:', dataIndexCounter)
}

/**
 * 更新右脑阻抗数据
 * @param {Number} rightValue - 右脑阻抗值
 */
function updateRightBrainData(rightValue) {
  // 管理右脑阻抗数据数组
  if (impedanceRight.length >= MAX_IMPEDANCE_DATA_LENGTH) {
    // 删除前500条数据
    impedanceRight.splice(0, 500)
    console.log('右脑数据达到上限，已删除前500条数据')
  }
  
  // 添加新的右脑阻抗数据
  impedanceRight.push(rightValue)
  
  // 增加数据索引计数器
  dataIndexCounter++
  
  console.log('右脑阻抗数组长度:', impedanceRight.length, '/', MAX_IMPEDANCE_DATA_LENGTH, '数据索引:', dataIndexCounter)
}

/**
 * 清空所有阻抗数据
 */
function clearImpedanceData() {
  impedanceLeft = []
  impedanceRight = []
  impedanceAll = []
  dataIndexCounter = 0
  console.log('已清空所有阻抗数据')
}

/**
 * 获取左脑阻抗数据
 * @returns {Array} 左脑阻抗数据数组
 */
function getLeftBrainData() {
  console.log('ImpedanceDataService.getLeftBrainData 被调用', impedanceLeft.length);
  // 返回数组的副本，而不是引用，确保响应式更新
  return [...impedanceLeft];
}

/**
 * 获取右脑阻抗数据
 * @returns {Array} 右脑阻抗数据数组
 */
function getRightBrainData() {
  console.log('ImpedanceDataService.getRightBrainData 被调用', impedanceRight.length);
  // 返回数组的副本，而不是引用，确保响应式更新
  return [...impedanceRight];
}

/**
 * 获取全脑平均阻抗数据
 * @returns {Array} 全脑平均阻抗数据数组
 */
function getAllBrainData() {
  return impedanceAll
}

/**
 * 获取数据索引计数器
 * @returns {Number} 数据索引计数器
 */
function getDataIndexCounter() {
  return dataIndexCounter
}

/**
 * 计算EIT值变化率
 * @param {String} brainType - 脑区类型，'left'或'right'
 * @returns {String} 格式化后的EIT值变化率
 */
function calculateEITChangeRate(brainType) {
  // 根据脑区类型获取对应的阻抗数据
  const impedanceData = brainType === 'left' ? impedanceLeft : impedanceRight
  
  // 如果没有数据或只有一个数据点，返回0%
  if (impedanceData.length <= 1) {
    return '0%'
  }

  // 只考虑最近的100个数据点（如果有的话）
  const recentData = impedanceData.slice(Math.max(0, impedanceData.length - 100))
  
  // 找出最近数据中的最大值和最小值
  const maxValue = Math.max(...recentData)
  const minValue = Math.min(...recentData)

  // 如果最小值为0，为避免除以0的错误，返回特殊值
  if (minValue === 0) {
    return '∞'
  }

  // 计算变化率：(最大值-最小值)/最小值*100
  const changeRate = ((maxValue - minValue) / minValue) * 100

  // 格式化为两位小数的百分比
  return changeRate.toFixed(2) + '%'
}

// 导出服务函数
export default {
  addImpedanceData,
  updateLeftBrainData,
  updateRightBrainData,
  clearImpedanceData,
  getLeftBrainData,
  getRightBrainData,
  getAllBrainData,
  getDataIndexCounter,
  calculateEITChangeRate
} 